package order.service;

import lombok.extern.slf4j.Slf4j;
import order.mapper.OrderMapper;
import order.model.OrderInfo;
import order.model.ProductInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.netflix.eureka.EurekaServiceInstance;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Slf4j
@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    private static AtomicInteger atomicInteger = new AtomicInteger(0); // 一个自增变量

    private static List<ServiceInstance> instances;


    public OrderInfo selectByOrderId(Integer orderId) {
          //第一版

//        //1.获取订单对象
//        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
//        //2.求商品url
//        String url = "http://127.0.0.1:9090/product/" + orderInfo.getProductId();
//        //3.获取商品对象（通过http请求的方式）
//        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
//        //4.构造最终返回结果
//        orderInfo.setProductInfo(productInfo);
//        return orderInfo;

          //第二版 -- 服务注册&服务发现

//        //1.获取订单对象
//        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
//        //2.获取“服务注册”列表
//        List<ServiceInstance> instances = discoveryClient.getInstances("product-service");
//        //3.获得列表的第一个服务-商品服务并获取uri：ip+端口
//        String uri = instances.get(0).getUri().toString();
//        //4.拼接商品url
//        log.info("uri = {}", uri);
//        String url = uri+ "/product/" + orderInfo.getProductId();
//        //4.获取商品对象（通过http请求的方式）
//        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
//        //5.构造最终返回结果
//        orderInfo.setProductInfo(productInfo);
//        return orderInfo;

        //第三版 -- 负载均衡

        //1.获取订单对象
        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
        //2.获取“服务注册”列表
        instances = discoveryClient.getInstances("product-service");
        //3.获得列表的第一个服务-商品服务并获取uri：ip+端口
        int index = atomicInteger.getAndIncrement() % instances.size() ;
        ServiceInstance serviceInstance = instances.get(index);//随机获取其中一个服务实例
        //4.拼接商品url
        log.info(serviceInstance.getInstanceId()); //打印获取到的实力port
        String url = serviceInstance.getUri()+ "/product/" + orderInfo.getProductId();
        //4.获取商品对象（通过http请求的方式）
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        //5.构造最终返回结果
        orderInfo.setProductInfo(productInfo);
        return orderInfo;


    }

}
